# -*- coding: utf-8 -*-

#    Copyright (C) 2005, 2006, 2007 2008, 2009, 2010 by Promotux
#                        di Francesco Meloni snc - http://www.promotux.it/

#    Author: Francesco Meloni  <francesco@promotux.it>

#    This file is part of Promogest.

#    Promogest is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 2 of the License, or
#    (at your option) any later version.

#    Promogest is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.

#    You should have received a copy of the GNU General Public License
#    along with Promogest.  If not, see <http://www.gnu.org/licenses/>.

import datetime
try:
    from collections import OrderedDict
except:
    from ordereddict import OrderedDict
from promogest.ui.utils import *
from promogest.lib.page import Page
from promogest.lib.webutils import Response, expose
from promogest.dao.Articolo import Articolo
from promogest.dao.Listino import Listino
from promogest.dao.Cliente import Cliente
from promogest.dao.Fornitore import Fornitore
from promogest.dao.Vettore import Vettore
from promogest.dao.CategoriaArticolo import CategoriaArticolo
from promogest.dao.Fornitura import Fornitura
from promogest.dao.AliquotaIva import AliquotaIva
from promogest.dao.Multiplo import Multiplo
from promogest.dao.TestataDocumento import TestataDocumento
from promogest.dao.RigaDocumento import RigaDocumento
from promogest.dao.ScontoTestataDocumento import ScontoTestataDocumento
from promogest.lib.session import Session
from promogest.dao.Cart import Cart
import simplejson as json


def ordineDaCliente(req, dao=None, action=None):
    """
    versione alpha di un ordine da cliente
    """
    #pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
    #categorie = CategoriaArticolo().select(batchSize=None, orderBy="id")
    #daoCliente = Cliente().getRecord(id=req.form.get("id_cliente"))

    def __impiantoOrdine(req, dao=None, action=None, done=False):
        diz = OrderedDict()
        righe_ordine = OrderedDict()
        id_cliente = req.form.get("id_cliente")
        action = req.form.get("action")
        dao_td_per_edit = None
        prezzi = OrderedDict()
        pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
        categorie = CategoriaArticolo().select(batchSize=None, orderBy="id")
        daoCliente = Cliente().getRecord(id=req.form.get("id_cliente"))
        for c in categorie:
            art = Articolo().select(idCategoria = c.id,orderBy="denominazione", idStato=1, batchSize=None)
            for a in art:
                prezzi[a.id] = leggiListino(pricelist[0].id, a.id, tiny=True)["prezzoDettaglio"]
            diz[c]= art
        rc = OrderedDict()
        trash = req.form.get("trash")
        if id_cliente:
            righe_cart = Cart().select(idCliente=id_cliente,
                    batchSize=None)
            for r in righe_cart:
                if trash =="true":
                    r.delete()
                else:
                    rc[r.id_articolo] = r.quantita

        pageData = {'file' : 'ordine_da_cliente',
                    "diz": diz,
                    "daoCliente": daoCliente,
                    "ordinepage":"ordinepage",
                    "id_cliente":id_cliente,
                    "righe_ordine":righe_ordine,
                    "prezzi": prezzi,
                    "rc":rc,
                    "now": datetime.datetime.now(),
                    }
        return Page(req).render(pageData)

    def __invio_ordine_da_cliente__(self, dao=None, action=None):
        data_ordine = datetime.datetime.now()
        if req.form.get("txn_id"):
            if req.form.get('payment_status') =='Completed' or (req.form.get('payment_status') =='Pending' and req.form.get('pending_reason') =='multi_currency'):
                dati = req.form.get("custom").split("|||")
                id_cliente = int(dati[0])
                professionista = dati[1]
                tipoPagamento = dati[2]
            else:
                print "EERRRROOOORE"
        else:
            dati = req.form.get("custom").split("|||")
            id_cliente = int(dati[0])
            professionista = dati[1]
            tipoPagamento = dati[2]
        daoCliente = Cliente().getRecord(id=id_cliente)
        pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
        newDao = TestataDocumento()
        newDao.data_documento = data_ordine
        newDao.data_inserimento = data_ordine
        newDao.operazione = "Ordine da cliente"
        newDao.id_cliente = id_cliente
        newDao.id_fornitore = None
        if daoCliente.dm:
            newDao.id_destinazione_merce = daoCliente.dm[0].id
        else:
            newDao.id_destinazione_merce = None
        if tipoPagamento != "checked": #contrassegno
            newDao.id_pagamento = 4
        else:
            newDao.id_pagamento = 5
        newDao.id_banca = None
        newDao.id_aliquota_iva_esenzione = None
        newDao.protocollo = ""
        newDao.causale_trasporto = ""
        newDao.aspetto_esteriore_beni = ""
        newDao.inizio_trasporto = None
        newDao.fine_trasporto = None
        newDao.id_vettore = None
        newDao.incaricato_trasporto = None
        newDao.totale_colli = None
        newDao.totale_peso = None
        newDao.note_interne = professionista
        newDao.note_pie_pagina = ""
        newDao.applicazione_sconti = "scalare"
        scontiSuTotale = []

        righeDocumento=[]
        righe_cart = Cart().select(idCliente=id_cliente,
                            batchSize=None)
        totale = 0
        for r in righe_cart:
            quantita = r.quantita
            idArticolo = r.id_articolo
            prezzo = leggiListino(pricelist[0].id, idArticolo, tiny=True)["prezzoIngrosso"]
            articolo = leggiArticolo(idArticolo)
            daoRiga = RigaDocumento()
            daoRiga.id_testata_documento = newDao.id
            daoRiga.id_articolo = idArticolo
            daoRiga.id_magazzino = 1
            daoRiga.descrizione = articolo["denominazione"]
            daoRiga.id_iva = articolo["idAliquotaIva"]
            daoRiga.id_listino = pricelist[0].id
            daoRiga.valore_unitario_lordo = prezzo
            daoRiga.valore_unitario_netto = prezzo
            daoRiga.percentuale_iva = articolo["percentualeAliquotaIva"]
            daoRiga.applicazione_sconti = []
            daoRiga.quantita = quantita
            daoRiga.id_multiplo = None
            daoRiga.moltiplicatore = 1
            daoRiga.scontiRigaDocumento = []
            righeDocumento.append(daoRiga)
            parziale = float(r.quantita) * float(leggiListino(pricelist[0].id, r.id_articolo, tiny=True)["prezzoDettaglio"])
            totale += parziale
        if totale<=100 and totale >0:
            daoRiga = RigaDocumento()
            daoRiga.id_testata_documento = newDao.id
            #daoRiga.id_articolo = idArticolo
            #daoRiga.id_magazzino = 1
            daoRiga.descrizione = "Contributo Spese di spedizione"
            daoRiga.id_iva = 3 # bruttissimo ma al momento non si può fare altrimenti
            #daoRiga.id_listino = pricelist[0].id
            daoRiga.valore_unitario_lordo = 7.438
            daoRiga.valore_unitario_netto = 7.438
            daoRiga.percentuale_iva = 21
            daoRiga.applicazione_sconti = []
            daoRiga.quantita = 1
            daoRiga.id_multiplo = None
            daoRiga.moltiplicatore = 1
            daoRiga.scontiRigaDocumento = []
            righeDocumento.append(daoRiga)
        if totale<=200 and totale >0 and tipoPagamento != "checked":
            daoRiga = RigaDocumento()
            daoRiga.id_testata_documento = newDao.id
            #daoRiga.id_articolo = idArticolo
            #daoRiga.id_magazzino = 1
            daoRiga.descrizione = "Pagamento in Contrassegno"
            daoRiga.id_iva = 3 # bruttissimo ma al momento non si può fare altrimenti
            #daoRiga.id_listino = pricelist[0].id
            daoRiga.valore_unitario_lordo = 2.909
            daoRiga.valore_unitario_netto = 2.909
            daoRiga.percentuale_iva = 21
            daoRiga.applicazione_sconti = []
            daoRiga.quantita = 1
            daoRiga.id_multiplo = None
            daoRiga.moltiplicatore = 1
            daoRiga.scontiRigaDocumento = []
            righeDocumento.append(daoRiga)
        newDao.righeDocumento = righeDocumento
        if "zanotti" in daoCliente.ragione_sociale.lower():
            #odc = TestataDocumento().select(idCliente=id_cliente,
                                                #batchSize=None)
            odc = []
        else:
            odc = ["NON ANCORA"]
        primo_ordine = 0
        if not odc:
            if totale >100 and totale >0 and totale <200:
                primo_ordine = 20
            if totale >200 and totale >0 and totale <400:
                primo_ordine = 50
            if totale >400 and totale >0:
                primo_ordine = 150
            daoScontost = ScontoTestataDocumento()
            daoScontost.valore = primo_ordine
            daoScontost.tipo_sconto = "valore"
            scontiSuTotale.append(daoScontost)
        newDao.scontiSuTotale = scontiSuTotale

        newDao.totale_pagato = None
        newDao.totale_sospeso = None
        newDao.documento_saldato = None
        newDao.id_primo_riferimento = None
        newDao.id_secondo_riferimento = None
        tipo = "Ordine da cliente"
        valori = numeroRegistroGet(tipo=tipo, date=data_ordine)
        newDao.numero = valori[0]
        newDao.registro_numerazione= valori[1]
        if len(righeDocumento) > 0:
            newDao.persist()
        #rimuovo le righe dal carrello
#        righe_cart = Cart().select(sessionid= req.cookies["promogest_web"],idCliente=id_cliente, batchSize=None)
        for r in righe_cart:
            r.delete()
        redirectUrl="/main?co=ok"
        return Page(req).redirect(redirectUrl)
        #return __impiantoOrdine(req, dao=dao, action=action, done=True)

    if action == "invio_ordine":
        return __invio_ordine_da_cliente__(req, dao=dao, action=action)
    else:
        return __impiantoOrdine(req, dao=dao, action=action)

def _sa_to_dict(obj):
    for item in obj.__dict__.items():
        if item[0][0] is '_':
            continue
        if isinstance(item[1], str):
            yield [item[0], item[1].decode()]
        elif isinstance(item[1], datetime.datetime):
            yield [item[0], item[1].__str__()]
        else:
            yield item

def jsonn(obj):
    if isinstance(obj, list):
        return json.dumps(map(dict, map(_sa_to_dict, obj)))
    else:
        return json.dumps(dict(_sa_to_dict(obj)))


def out_string(totale):
    stri = ["","","","",""]
    if totale > 0 and totale < 100:
        stri[0] = "Mancano solo %s euro per usufruire dello sconto di 20 euro" % (mNLC(100 -totale,2))
    elif totale > 0 and totale > 100 and totale < 200:
        stri[0] = "Mancano solo %s euro per usufruire dello sconto di 50 euro" % (mNLC(200 -totale,2))
    elif totale > 0 and totale > 200 and totale < 400:
        stri[0] = "Mancano solo %s euro per usufruire dello sconto di 150 euro" % (mNLC(400 -totale,2))
    if totale > 0 and totale < 100:
        stri[1] = "Mancano solo %s  e non pagherai le spese di spedizione" % (mNLC(100 -totale,2))
    return stri


@expose("/calcola_totale_ordine")
def calcolaTotaleOrdine(req, riepilogo=False):

    totale = 0
    quantita = req.form.get("quantita")
    idArticolo =  req.form.get("idArticolo")
    trash =  req.form.get("trash")
    tipoPagamento = req.form.get("tipoPagamento")
    pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
    categorie = CategoriaArticolo().select(batchSize=None, orderBy="id")
    daoCliente = Cliente().getRecord(id=req.form.get("id_cliente"))
    #print "VEDIAMO UN PO? CHE DATI ARRIVANO", quantita,idArticolo,reset, tipoPagamento, pricelist, daoCliente.ragione_sociale
    if idArticolo:
        cart = Cart().select(idArticolo= idArticolo,
                            idCliente = daoCliente.id,
                            #sessionid= req.cookies["promogest_web"],
                            batchSize=None)
        if cart:
            cart = cart[0]
        else:
            cart = Cart()
            cart.id_articolo = idArticolo
            cart.sessionid = req.cookies["promogest_web"]
            cart.id_cliente = daoCliente.id

        cart.data_inserimento = datetime.datetime.now()
        if quantita:
            if int(quantita) == 0:
                cart.delete()
            else:
                cart.quantita = int(quantita)
                cart.persist()

    righe = Cart().select(idCliente = daoCliente.id,
                        batchSize=None)
    items = OrderedDict()

    if righe:
        for r in righe:
            if trash == "1":
                r.delete()
            else:
                parziale = float(r.quantita) * float(leggiListino(pricelist[0].id, r.id_articolo, tiny=True)["prezzoDettaglio"])
                totale += parziale
                articolo = leggiArticolo(r.id_articolo)
                #listino = leggiListino
                items[r.id_articolo] = (articolo,parziale, r.quantita)

    if "zanotti" in daoCliente.ragione_sociale.lower():
        #odc = TestataDocumento().select(idCliente = req.form.get("id_cliente"), batchSize=None)
        odc = []
    else:
        odc = ["NON ANCORA"]
    primo_ordine = 0
    subtotale = totale
    if not odc:
        if totale >100 and totale >0 and totale <200:
            totale -= 25
            primo_ordine = 25
        if totale >200 and totale >0 and totale <400:
            totale -= 50
            primo_ordine = 50
        if totale >400 and totale >0:
            primo_ordine = 100
            totale -= 100

    pushstring  = out_string(totale)
    #print "PUUUUUUUUUUUUUUUUSH", pushstring


    if totale<=100 and totale >0:
        spese_spedizione = 9.00
        totale += spese_spedizione
    else:
        spese_spedizione = 0
    if totale<=200 and totale >0 and tipoPagamento != "checked" and riepilogo:
        spese_contrassegno = 3.52
        totale+=spese_contrassegno
    else:
        spese_contrassegno = 0
    item = totale
    #print " RIEPILO GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", riepilogo,tipoPagamento
    if riepilogo:
        pageData = {'file' : 'riepilogo_ordine',
                "totale": item,
                "subtotale": subtotale,
                "righe":items,
                "daoCliente": daoCliente,
                "tipoPagamento": tipoPagamento,
                "ecco": req.form.get("ecco"),
                "spese_spedizione":spese_spedizione,
                "primo_ordine": primo_ordine,
                "spese_contrassegno":spese_contrassegno,
                "pushstring":pushstring
                }
    else:
        pageData = {'file' : 'display_cart',
                    "totale": item,
                    "subtotale": subtotale,
                    "righe":items,
                    "daoCliente": daoCliente,
                    "primo_ordine": primo_ordine,
                    "spese_spedizione":spese_spedizione,
                    "spese_contrassegno":spese_contrassegno,
                    "pushstring":pushstring
                    }
    return Page(req).render(pageData)

@expose("/ordine_da_cliente_scheda_articolo")
def schedaArticolo(req):
    #pricelist = Listino().select(id=setconf("VenditaDettaglio", "listino_vendita"))
    idArt = req.args.get("idArt")
    try:
        articolo = Articolo().getRecord(id=int(idArt))
    except:
        articolo = None

    pageData = {'file' : 'articolo',
                "dao": articolo,
                }
    return Page(req).render(pageData)

@expose('/riepilogo_ordine')
def riepilogoOrdine(req):
    return calcolaTotaleOrdine(req, riepilogo=True)

@expose('/storico_ordini')
def storicoOrdini(req, dao=None, action=None):
    daoCliente = Cliente().getRecord(id=req.form.get("id_cliente"))
    odc = []
    odc = TestataDocumento().select(idCliente = req.form.get("id_cliente"), batchSize=None)

    pageData = {'file' : 'storico_ordini',
                "daoCliente": daoCliente,
                "storicopage":"storicopage",
                "id_cliente":daoCliente.id,
                "odc":odc,
                "now": datetime.datetime.now(),
                    }
    return Page(req).render(pageData)

@expose('/visualizza_ordine')
def visualizzaOrdine(req, dao=None, action=None):
    daoCliente = Cliente().getRecord(id=req.form.get("id_cliente"))
    testataDocumento = TestataDocumento().getRecord(id=req.form.get("id_testata"))
    pageData = {'file' : 'documento',
                "daoCliente": daoCliente,
                "dao":testataDocumento,
                "storicopage":"storicopage",
                "id_cliente":daoCliente.id,
                "now": datetime.datetime.now(),
                    }
    return Page(req).render(pageData)
